package com.ecarx.camera.worker.car;

/**
 * 车身功能可用状态、设置值、取值或监听的接口定义
 */
public interface ICarFunctionProxy {

    /**
     * 获取功能的支持状态
     * @param functionId 功能Id
     * @return  功能是否支持
     */
    boolean isFunctionSupported(int functionId);

    /**
     * 获取功能的可用状态
     * @param functionId
     * @return
     */
    boolean isFunctionActive(int functionId);

    /**
     * 获取功能的可用状态
     * @param functionId
     * @param zone 区域
     * @return
     */
    boolean isFunctionActive(int functionId, int zone);

    /**
     * 设置功能的取值
     * @param functionId 功能Id
     * @param functionValue 功能取值
     * @return 操作是否成功
     */
    boolean setFunctionValue(int functionId, int functionValue);

    /**
     * 设置功能的取值
     * @param functionId 功能Id
     * @param zone 区域
     * @param functionValue 功能取值
     * @return 操作是否成功
     */
    boolean setFunctionValue(int functionId, int zone, int functionValue);

    /**
     * 获取功能的取值
     * @param functionId 功能Id
     * @return 功能的取值
     */
    int getFunctionValue(int functionId);

    /**
     * 获取功能的取值
     * @param functionId 功能Id
     * @param zone 区域
     * @return 功能的取值
     */
    int getFunctionValue(int functionId, int zone);

    /**
     * 设置功能的float取值
     * @param functionId 功能Id
     * @param functionValue 功能的float取值
     * @return 操作是否成功
     */
    boolean setFunctionFloatValue(int functionId, float functionValue);

    /**
     * 设置功能的float取值
     * @param functionId 功能Id
     * @param zone 区域
     * @param functionValue 功能的float取值
     * @return 操作是否成功
     */
    boolean setFunctionFloatValue(int functionId, int zone, float functionValue);

    /**
     * 获取功能的float取值
     * @param functionId 功能Id
     * @return 功能的float取值
     */
    float getFunctionFloatValue(int functionId);

    /**
     * 获取功能的float取值
     * @param functionId 功能Id
     * @param zone 区域
     * @return 功能的float取值
     */
    float getFunctionFloatValue(int functionId, int zone);

    /**
     * 设置功能的boolean取值
     * @param functionId 功能Id
     * @param functionValue 功能的boolean取值
     * @return 操作是否成功
     */
    boolean setFunctionBooleanValue(int functionId, boolean functionValue);

    /**
     * 设置功能的boolean取值
     * @param functionId 功能Id
     * @param zone 区域
     * @param functionValue 功能的boolean取值
     * @return 操作是否成功
     */
    boolean setFunctionBooleanValue(int functionId, int zone, boolean functionValue);

    /**
     * 获取功能的boolean取值
     * @param functionId 功能Id
     * @return 功能的boolean取值
     */
    boolean getFunctionBooleanValue(int functionId);

    /**
     * 获取功能的boolean取值
     * @param functionId 功能Id
     * @param zone 区域
     * @return 功能的boolean取值
     */
    boolean getFunctionBooleanValue(int functionId, int zone);

    /**
     * 注册指定功能的取值变化监听
     * @param functionId 功能Id
     * @param watcher 功能取值变化的回调监听
     * @return 操作是否成功
     */
    boolean registerFunctionValueWatcher(int functionId, IFunctionValueWatcher watcher);

    /**
     * 注册多个功能的取值变化监听
     * @param functionIds 功能Id数组
     * @param watcher 功能取值变化的回调监听
     * @return 操作是否成功
     */
    boolean registerFunctionValueWatcher(int[] functionIds, IFunctionValueWatcher watcher);

    /**
     * 注销功能的取值变化监听
     * @param watcher 功能取值变化的回调监听
     * @return 操作是否成功
     */
    boolean unregisterFunctionValueWatcher(IFunctionValueWatcher watcher);

    /**
     * 功能取值变化的回调监听接口定义
     */
    interface IFunctionValueWatcher {
        /**
         * 功能变化的回调（e.g. 功能的取值、状态等发生变化）
         * @param functionId 功能Id
         */
        void onFunctionChanged(int functionId);

        /**
         * 功能取值发生变化的回调（系统自身变化会回调，另外在调用{@link ICarFunctionProxy#setFunctionValue(int, int, int)} 或 {@link ICarFunctionProxy#setFunctionValue(int, int)} 时也会回调）
         * @param functionId 功能Id
         * @param zone 区域
         * @param functionValue 功能取值
         */
        void onFunctionValueChanged(int functionId, int zone, int functionValue);

        /**
         * 功能取值发生变化的回调（系统自身变化会回调，另外在调用{@link ICarFunctionProxy#setFunctionFloatValue(int, int, float)} 或 {@link ICarFunctionProxy#setFunctionFloatValue(int, float)} 时也会回调）
         * @param functionId 功能Id
         * @param zone 区域
         * @param functionValue 功能的float取值
         */
        void onFunctionFloatValueChanged(int functionId, int zone, float functionValue);

        /**
         * 功能取值发生变化的回调（系统自身变化会回调，另外在调用{@link ICarFunctionProxy#setFunctionBooleanValue(int, int, boolean)} 或 {@link ICarFunctionProxy#setFunctionBooleanValue(int, boolean)} 时也会回调）
         * @param functionId 功能Id
         * @param zone 区域
         * @param functionValue 功能的boolean取值
         */
        void onFunctionBooleanValueChanged(int functionId, int zone, boolean functionValue);

        /**
         * 功能的可用状态发生变化的回调，同时也会回调 {@link IFunctionValueWatcher#onFunctionChanged(int)}
         * @param functionId 功能Id
         * @param zone 区域
         * @param functionStatus 功能的可用状态
         */
        void onFunctionSupportedChanged(int functionId, int zone, @FunctionStatus int functionStatus);
    }
}
